Amazon RDSの拡張モニタリングのメトリクスをAWS CLIから取得してみた
Amazon RDSの拡張モニタリングを有効にすると、DB インスタンスが実行されているオペレーティングシステム (OS) のCPU、メモリ、ディスクI/O等に関するリアルタイムのメトリクスを取得できるようになります。
メトリクスはRDSコンソールで視覚化されていますが、今回は AWS CLI を使ってコマンドラインからメトリクスを取得する方法を紹介します。
やり方
拡張モニタリングを有効にすると、CloudWatch Logsのロググループ「RDSOSMetrics
」以下にリソースIDごとにログストリームが作成され、メトリクスはJSON形式でこのストリームにログ出力されます。
したがって、AWS CLIから CloudWatch Logs に対して
- ロググループ(
RDSOSMetrics
固定) - ログストリーム(DBインスタンスのリソースID(
DbiResourceId
)) - 時刻
を指定すると、拡張モニタリングのメトリクスを取得できます。
CloudWatch Logsのログを確認
CloudWatch Logsに出力された拡張メトリクスのログを確認します。
$ aws logs get-log-events \ --log-group-name RDSOSMetrics \ --log-stream-name db-XXX \ --limit 1 { "events": [ { "timestamp": 1584301622000, "message": "{\"engine\":\"Aurora\",\"instanceID\":\"AAA\",\"instanceResourceID\":\"db-XXX\",... ,\"vmlimit\":0}]}", "ingestionTime": 1584301622342 }, ... ], "nextForwardToken": "f/111", "nextBackwardToken": "b/222" }
message
が求める拡張メトリクスデータです。JSONオブジェクトが文字列に変換されています。
レコード件数は --limit
で指定します。
メトリクス全体を確認
jq でゴニョゴニョして文字列の message
を JSON に変換して表示させます。
$ aws logs get-log-events \ --log-group-name RDSOSMetrics \ --log-stream-name db-XXX \ --limit 1 | jq -r '.events[].message | fromjson' { "engine": "Aurora", "instanceID": "AAA", "instanceResourceID": "db-XXX", ... "cpuUtilization": { "guest": 0, "irq": 0, ...
時刻を指定
時刻を指定してメトリクスを取得したい場合、時刻をミリ秒のUNIX TIMEで指定します。
--end-time 方式
$ aws logs get-log-events \ --log-group-name RDSOSMetrics \ --log-stream-name db-XXX \ --end-time UNIX-TIME-IN-MS \ --limit 3
--end-time
で時刻を指定すると、--end-time
以前の最新レコードを取得します。
--start-time 方式
$ aws logs get-log-events \ --log-group-name RDSOSMetrics \ --log-stream-name db-XXX \ --start-time UNIX-TIME-IN-MS --start-from-head \ --limit 3
--start-time
で時刻を指定すると、--start-time
以降のレコードを取得します。
--start-from-head
オプションを指定することで、--start-time
時刻に近い古いレコードから順に取得します。
--start-time
で指定するときは --start-from-head
オプションも一緒に指定して下さい。
ミリ秒の UNIX TIME の計算方法
前提として、Mac 標準の BSD 系 date コマンドでミリ秒の UNIX TIME を計算します。
クロスプラットフォームに計算したい場合は、プログラム言語を利用すると良いでしょう。
現在時刻
$ unix_time=$(($(date +'%s * 1000 + %-N / 1000000')))
相対時刻
date コマンドに現在時刻とのデルタ(-v
)を渡します。
1時間前なら -v1H
となります。
$ unix_time=$(($(date -v-1H +'%s * 1000 + %-N / 1000000')))
同様に、10分前なら -v10m
、1日前なら -v1d
となります。
特定の時刻
$ target_time="2020-03-10T10:00:00+0900" $ unix_time=$(expr `date -j -f %FT%T%z ${target_time} +%s` \* 1000)
最終コマンド
過去のある時点(2020/03/10 10:00:00 JST)のロードアベレージを3件取得する場合、次のコマンドになります。
$ target_time="2020-03-10T10:00:00+0900" $ unix_time=$(expr `date -j -f %FT%T%z ${target_time} +%s` \* 1000) $ aws logs get-log-events \ --log-group-name RDSOSMetrics \ --log-stream-name db-XXX \ --end-time $unix_time --limit 3 | jq -r '.events[].message | fromjson.loadAverageMinute' { "one": 0.37, "five": 1.11, "fifteen": 1.19 } { "one": 0.13, "five": 0.91, "fifteen": 1.11 } { "one": 0.05, "five": 0.74, "fifteen": 1.04 }
補足
拡張モニタリングが取得しているメトリクスはDBエンジンごとに異なります。
一覧は次のページからご確認ください。